package com.zxy.shaozhiyi1.main.error;

import static org.testng.Assert.assertNotNull;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PushbackInputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import org.apache.poi.POIXMLDocument;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openqa.selenium.By;
import org.openqa.selenium.By.ById;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.AssertJUnit;
import org.testng.annotations.Test;

import com.zxy.shaozhiyi1.main.Constant;
import com.zxy.shaozhiyi1.util.excel.ExcelUtil;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class TestMultipleThreadsErroryuanshi {

	public WebDriver driver = null;
	public WebElement webelement = null;
	
	/**
	 * 全自动化接口
	 * 自动化成都：70%
	 * 开发状态：开发中
	 * 难度等级：3.5（1----5个等级）
	 * 
	 * @throws InterruptedException
	 * @throws IOException
	 */
	@Test(invocationCount = 1)
	public void loadTestThisWebsite2() throws InterruptedException, IOException
	{
		// testNG打开条件页
		
		
		// 判断是否如期打开了条件页
		// TODO
		boolean isSuccessOpenSearchPage = false;
		
		if(!isSuccessOpenSearchPage)
		{
			// 如果如期打开了条件页
			
			// 继续执行
		}
		else
		{
			// 给出警告提示
			
			// 继续尝试打开（尝试3次）
			// TODO:
			
			// 如果3次尝试都没有如期打开，则给出最终警告提示，给出建议解决方案，退出程序。
			// TODO
			
		}
		
		
		// 正确打开条件页的前提下
		
		// 循环等待用户输入搜索条件   和   验证码，点击搜索按钮
		// 循环判断是否已经跳转到了结果页
		while(true)
		{
			// 每次判断前任务休息1s
			Thread.sleep(1000);
			
			// 继续判断
			
			// 判断是否已经跳转到了结果页
			// TODO
			String bl = Random.class.toString();
			
			
			if(bl.equals("yes"))
			{
				// 已经跳转倒了结果页
				
				// 从while循环中退出
				
				break;
			}
			else
			{
				// 没有跳转到结果页
				
				// 继续while循环判断
				continue;
			}
		}
		
		// 判断是否是正确的结果页
		// TODO:封装为一个方法，改方法返回3个字符串，yes代表正确的结果页，no代表非正确的结果页，"meiyourenweicaozuo"代表一种半正确状态
		boolean isSuccessDataGridPage = false;
		String isSuccessDataGridPageStr = "";
		
		if(isSuccessDataGridPageStr.equals("no"))
		{
			// 如果不是正确的结果页
			
			
		}
		else if(isSuccessDataGridPageStr.equals("meiyourenweicaozuo"))
		{
			// 没有人为操作的话
			
			// 继续返回到上一个while循环流程中继续判断
		}
		else if(isSuccessDataGridPageStr.equalsIgnoreCase("yes"))
		{
			// 如果是正确的结果页
			
			// 去除结果页中dataGrid中的数据，持久化到数据库中
			// TODO:取dataGrid中的数据并且持久化到数据库中，必须进行封装
			
			// 取数据存数据完毕后，跟上面的没有人为操作分支一样，
			// 继续返回到上一个while循环中继续判断，判断结果页是不是正确的结果页
		}
		
		
		
		
		
		
	} 
	
	@Test(invocationCount = 1)
	public void loadTestThisWebsite1() throws InterruptedException, IOException
	{
		//讲谷歌驱动拷贝到项目下 "D:\\geckodriver.exe");
//      System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
		
		
		// Firefox浏览器
		// System.setProperty("webdriver.firefox.bin", "D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
		// System.setProperty("webdriver.gecko.driver", "D:\\geckodriver.exe");
		// System.setProperty("webdriver.firefox.marionette", "D:\\geckodriver.exe");
		// WebDriver driver = new FirefoxDriver();
		System.setProperty("webdriver.chrome.driver", "F:\\chromedriver.exe");
		WebDriver driver = new ChromeDriver();
		driver.get("https://isisn.nsfc.gov.cn/egrantindex/funcindex/prjsearch-list");
		System.out.println("Page Title is " + driver.getTitle());
		// AssertJUnit.assertEquals("Google", driver.getTitle());
		
		// 在20s之内操作树，年份选择，图片验证码输入
		// 树展开按钮
		webelement = driver.findElement(By.xpath("//a[@id = \"f_subjectCode_img\"]"));
		// 点击
		webelement.click();
		
		// 树展开
		
		Thread.sleep(5000);// 5s
		
		// 树DIV
		webelement = driver.findElement(By.xpath("//div[@id = \"f_subjectCode_treeId\"]"));
		// 所有一级节点
		List<WebElement> webelements1 = webelement.findElements(By.tagName("li"));
		System.out.println("1111111111-----   " + webelements1.size());
		
		// 所有一级节点的第一个节点（A.数理科学部）
		// 左边 +号 按钮
		webelement = webelements1.get(0).findElement(By.tagName("button"));
		// 点击 +号 按钮
		webelement.click();
		for (WebElement webElement : webelements1) {
			
		}
		
		// 展开（A.数理科学部）
		
		Thread.sleep(5000);// 5s
		
		webelement = webelements1.get(0).findElement(By.tagName("ul"));
		// 所有2级节点
		List<WebElement> webelements2 = webelement.findElements(By.tagName("li"));
		// +号 按钮  后面的 链接
		webelement = webelements2.get(0).findElement(By.tagName("a"));
		// 点击  +号 按钮  后面的 链接，把值给textbox
		webelement.click();
		
		// 展开（A.数理科学部）
		
		Thread.sleep(5000);// 5s
		
		/*// +号 按钮  后面的 链接
		webelement = webelements1.get(0).findElement(By.tagName("a"));
		// 点击  +号 按钮  后面的 链接，把值给textbox
		webelement.click();*/
		
		Thread.sleep(5000);// 5s
		
		/*webelement = driver.findElement(By.xpath("//div[@id = \"f_subjectCode_treeId\"]"));
		
		
		
		
		// A.数理科学部 前面的+号
		webelement = driver.findElement(By.xpath("//button[@id = \"f_subjectCode_treeId_115_switch\"]"));
		// 点击
		webelement.click();
		
		Thread.sleep(5000);// 5s
		
		// A01.数学
		webelement = driver.findElement(By.xpath("//span[@id = \"f_subjectCode_treeId_87_span\"]"));
		// 点击
		webelement.click();*/
		
		Thread.sleep(5000);// 5s
		
//		Select select = (Select) driver.findElement(By.xpath("//select[@id = \"f_year\"]"));
		Select sel = new Select(driver.findElement(ById.xpath("//select[@id='f_year']")));
		sel.selectByValue("2016");
		
		Thread.sleep(10000);// 20s
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		String filePath1 = "d:" + File.separator + "test111111111111.xls";
//		String filePath2 = "D:\\test333333333333.xls";
		String filePath2 = "D:" + File.separator + "test333333333333.xls";
		
		// 第1步、使用File类找到一个文件
		// 声明File对象
		File file = new File(filePath1);
		// 第2步、通过子类实例化父类对象
		OutputStream outputStream = null; // 准备好一个输出的对象
		// out = new FileOutputStream(file) ; // 通过对象多态性，进行实例化
		outputStream = new FileOutputStream(file, true); // 通过对象多态性，进行实例化
		
		/*
		 * // 第3步、进行写操作
		 * String str = "Hello World!!!" ; // 准备一个字符串 byte b[] =
		 * str.getBytes() ; // 只能输出byte数组，所以将字符串变为byte数组 out.write(b) ; // 将内容输出，保存文件 //
		 * 第4步、关闭输出流 out.close() ; // 关闭输出流 //文件不存在会自动创建
		 */

		// BufferedWriter bufout = new BufferedWriter(new OutputStreamWriter(new
		// FileOutputStream("d:" + File.separator + "test111111.xls", true)));
		
//		FileOutputStream fileOutputStream = new FileOutputStream(filePath2);

//		ExcelUtil.exportExcel(filePath2, "titile", headMap, jsonArray, null, 20, fileOutputStream, rowIndex);
		
		FileInputStream fileInputStream = new FileInputStream(filePath2);
		Workbook workbook = getWorkbook(fileInputStream);
		
	}

	@Test(invocationCount = 1)
	public void exportData() throws InterruptedException, IOException
	{
		// Google浏览器
		// 经实际对比效果，Google浏览器较为稳定
		System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
		WebDriver driver = new ChromeDriver();
		driver.get(Constant.URL);
		System.out.println("Page Title is " + driver.getTitle());
		// AssertJUnit.assertEquals("Google", driver.getTitle());
		
		// 休息25s，等待用户操作（输入检索条件：学科，年份，输入4位图片验证码，点击检索按钮）
		// 经实际运行测试，发现25s的等待时间是一个比较科学的等待时间，对用户来说既充足，也不会太浪费时间
		String jiansuoyemian_datagridyemian_str = Constant.JIANSUOYEMIAN_DATAGRIDYEMIAN;
		int jiansuoyemian_datagridyemian_int = Integer.parseInt(jiansuoyemian_datagridyemian_str);
		// 默认20s
		Thread.sleep(jiansuoyemian_datagridyemian_int);

		int pageNo = 1;
		// 起始行0
		int rowIndex = 0;
		// 导出页数
		String exprotPageCountStr = Constant.TEST;
		int exprotPageCountInt = Integer.parseInt(exprotPageCountStr);
		while (pageNo < exprotPageCountInt + 1)
		{
			if(pageNo != 1)
			{
				// 如果不是第一次进入dataGrid结果页，让程序等待15s给用户输入
				// 休息20s等待用户操作（输入4位图片验证码，点击下一页按钮）
				// 经实际运行测试，发现在dataGrid结果页，20s的等待时间是一个比较科学的等待时间，对用户来说既充足，也不会太浪费时间
				String datagridyemian_datagridyemian_str = Constant.DATAGRIDYEMIAN_DATAGRIDYEMIAN;
				int datagridyemian_datagridyemian_int = Integer.parseInt(datagridyemian_datagridyemian_str);
				// 默认20s
				Thread.sleep(datagridyemian_datagridyemian_int);
			}
			
			// 从结果页面取到dataGrid
			webelement = driver.findElement(By.xpath("//table[@id = \"dataGrid\"]"));
			// 取到dataGrid中所有的tr元素（即：取到所有的行，包括了表头行）
			List<WebElement> webelementtrs = webelement.findElements(By.tagName("tr"));
			
			// 不管页面是否加载成功，表头行肯定存在，所以先移除表头行
			webelementtrs.remove(0);
			int size = webelementtrs.size();
			System.out.println("当前页中总共有      " +size + "   行数据");

			// excel写入接口需要一个json数组
			JSONArray jsonArray = new JSONArray();
			// 所有行
			int rowNo = 1;
			for (WebElement webElementtr : webelementtrs)
			{
				JSONObject jsonObject = new JSONObject();
				System.out.println("第" + rowNo + "行的数据为：" + webElementtr.getText());
				
				// 取到所有td元素（即：取到所有的列）
				List<WebElement> webElementtds = webElementtr.findElements(By.tagName("td"));
				int columenNo = 1;
				// 所有列
				for (WebElement webElementtd : webElementtds)
				{
					String text = webElementtd.getText();
					System.out.println("第" + rowNo + "行，第" + columenNo + "列的数据为：" + webElementtr.getText());
					System.out.println(text);

					jsonObject.put("columen" + columenNo, text);
					columenNo++;
				}

				jsonArray.add(jsonObject);
				rowNo++;
			}
			System.out.println("要往excel中存入到封装好的数据为：   " + jsonArray.toString());

			// 用LinkedHashMap，避免列头无序的问题。
			Map<String, String> headMap = new LinkedHashMap<>();
			headMap.put("columen1", "value_1");
			headMap.put("columen2", "value_2");
			headMap.put("columen3", "value_3");
			headMap.put("columen4", "value_4");
			headMap.put("columen5", "value_5");
			headMap.put("columen6", "value_6");
			headMap.put("columen7", "value_7");
			headMap.put("columen8", "value_8");
			
			// 最后输出的文件
			String filePath = "D:" + File.separator + "data.xls";
			
			excel(filePath, headMap, jsonArray, rowIndex, 20, null);
			System.out.println("第      " + pageNo + "   页的数据保存完毕");
			
			// 起始行计算
			rowIndex = pageNo * 12 + 1;
			// 页数计算
			pageNo++;
		}

		Thread.sleep(10000);
		
		// driver.quit();
	}
	
	
	
	/**
	 * excel导出
	 * 
	 * @param filePath 输出的文件
	 * @param headMap 表头
	 * @param jsonArray 表体
	 * @param rowIndex 起始行
	 * @param colWidth 列宽
	 * @param datePattern 日期格式
	 * @param pageNo 页号
	 */
	public void excel(String filePath, Map<String, String> headMap, JSONArray jsonArray, 
			           int rowIndex, int colWidth, String datePattern)
	{
		// 输出流
		try {
			FileInputStream fileInputStream = new FileInputStream(filePath);
			Workbook workbook = getWorkbook(fileInputStream);
			
			/*Row row = sheet1.createRow(sheet1.getLastRowNum() + 1);
			row.setHeightInPoints((short) 25);
			// 给这一行赋值
			row.createCell(0).setCellValue("12");
			row.createCell(1).setCellValue("23");
			FileOutputStream os = new FileOutputStream(filePath);
			workbook.write(os);
			fileInputStream.close();
			os.close();

			FileInputStream is2 = new FileInputStream(filePath);
			Workbook wb2 = getWorkbook(is2);
			System.out.println("aaa");
			Sheet sheet12 = wb2.getSheetAt(0);
			System.out.println(sheet12.getLastRowNum());
			Row row2 = sheet12.createRow(sheet12.getLastRowNum() + 1);
			row2.setHeightInPoints((short) 25);
			// 给这一行赋值
			row2.createCell(0).setCellValue("12");
			row2.createCell(1).setCellValue("23");
			FileOutputStream os2 = new FileOutputStream(filePath);
			wb2.write(os2);
			is2.close();
			os2.close();*/
			
			
			Sheet sheet = workbook.getSheetAt(0);
			System.out.println("最后一行的行号是：  " + sheet.getLastRowNum());
			
			// 列头样式
			HSSFCellStyle headerStyle = (HSSFCellStyle) workbook.createCellStyle();
			headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
			headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
			headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
			headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
			headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
			headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			HSSFFont headerFont = (HSSFFont) workbook.createFont();
			headerFont.setFontHeightInPoints((short) 12);
			headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
			headerStyle.setFont(headerFont);
			
			// 设置列宽
			int minBytes = colWidth < Constant.DEFAULT_COLOUMN_WIDTH ? Constant.DEFAULT_COLOUMN_WIDTH : colWidth;// 至少字节数
			int[] arrColWidth = new int[headMap.size()];
			
			// 产生表格标题行,以及设置列宽
			String[] properties = new String[headMap.size()];
			String[] headers = new String[headMap.size()];
			int ii = 0;
			for (Iterator<String> iter = headMap.keySet().iterator(); iter.hasNext();) {
				String fieldName = iter.next();

				properties[ii] = fieldName;
				headers[ii] = fieldName;

				// 设置列宽
				int bytes = fieldName.getBytes().length;
				arrColWidth[ii] = bytes < minBytes ? minBytes : bytes;
				sheet.setColumnWidth(ii, arrColWidth[ii] * 256);
				ii++;
			}
			
			// 单元格样式
			HSSFCellStyle cellStyle = (HSSFCellStyle) workbook.createCellStyle();
			cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
			cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
			cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
			cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
			cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
			HSSFFont cellFont = (HSSFFont) workbook.createFont();
			cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
			cellStyle.setFont(cellFont);
			
			boolean bl = false;
			int qishihang = -1;
			// 遍历集合数据，产生数据行
			for (Object obj : jsonArray)
			{
				// 产生表头
				if (rowIndex == 65535 || rowIndex == 0)
				{
					if (rowIndex != 0)
					sheet = workbook.createSheet();// 如果数据超过了，则在第二页显示
					
//					sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headMap.size() - 1));
					// 列头
//					HSSFRow headerRow = (HSSFRow) sheet.createRow(rowIndex);
					/*HSSFRow headerRow = (HSSFRow) sheet1.createRow(sheet1.getLastRowNum() + 1);
					for (int i = 0; i < headers.length; i++)
					{
						headerRow.createCell(i).setCellValue(headers[i]);
						headerRow.getCell(i).setCellStyle(headerStyle);

					}*/
					// rowIndex = 2;//数据内容从 rowIndex=2开始
//					rowIndex++;
				}
				
				if (datePattern == null)
					datePattern = Constant.DEFAULT_DATE_PATTERN;
				
				// JSONObject jo = (JSONObject) JSONObject.toJSON(obj);
				JSONObject jsonObject = JSONObject.fromObject(obj);
//				HSSFRow dataRow = (HSSFRow) sheet.createRow(rowIndex);
				int lashRowNum = sheet.getLastRowNum();
				System.out.println("最后一行的行号是：----------：" + lashRowNum);
				HSSFRow dataRow;
				if(lashRowNum == 0 && qishihang == -1)
				{
					dataRow = (HSSFRow) sheet.createRow(lashRowNum);
				}
				else
				{
					dataRow = (HSSFRow) sheet.createRow(lashRowNum + 1);
				}
				qishihang++;
				
				
//				HSSFRow dataRow = (HSSFRow) sheet1.createRow(sheet1.getLastRowNum() + 1);
				
				for (int i = 0; i < properties.length; i++)
				{
					HSSFCell newCell = dataRow.createCell(i);

					Object o = jsonObject.get(properties[i]);
					String cellValue = "";
					if (o == null)
						cellValue = "";
					else if (o instanceof Date)
						cellValue = new SimpleDateFormat(datePattern).format(o);
					else
						cellValue = o.toString();

					newCell.setCellValue(cellValue);
					
					newCell.setCellStyle(cellStyle);
				}
				rowIndex++;
			}
			
			FileOutputStream fileOutputStream = new FileOutputStream(filePath);
			workbook.write(fileOutputStream);
			fileInputStream.close();
			fileOutputStream.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static Workbook getWorkbook(InputStream is) throws IOException {
		Workbook wb = null;
		if (!is.markSupported()) {
			is = new PushbackInputStream(is, 8);
		}
		if (POIFSFileSystem.hasPOIFSHeader(is)) { // Excel2003及以下版本
			wb = (Workbook) new HSSFWorkbook(is);
		} else if (POIXMLDocument.hasOOXMLHeader(is)) { // Excel2007及以上版本
			wb = new XSSFWorkbook(is);
		} else {
			throw new IllegalArgumentException("你的Excel版本目前poi无法解析！");
		}
		// }
		return wb;
	}

	public static void method1(String file, String conent) {
		BufferedWriter out = null;
		try {
			out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true)));
			out.write(conent);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (out != null) {
					out.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	// 封装highlight
	public WebElement highLight(WebElement webElement) {
		JavascriptExecutor js = (JavascriptExecutor) driver;
		js.executeScript("arguments[0].setAttribute('style', arguments[1]);", webElement,
				"background: yellow;color: red; border: 2px solid red;");
		return webElement;
	}

	@Test(priority = 10)
	public void searchCSDN() throws InterruptedException {
		webelement = driver.findElement(By.xpath("//input[@id = \"kw\"]"));
		highLight(webelement);
		webelement.sendKeys("csdn");

		webelement = driver.findElement(By.xpath("//*[@id=\"su\"]"));
		highLight(webelement);
		webelement.click();

		Thread.sleep(3001);
	}

	/**
	 * @param args
	 */
	public static void main1(String[] args) {
		System.setProperty("webdriver.firefox.marionette", "D:\\geckodriver.exe");
		System.setProperty("webdriver.firefox.bin", "D:\\developtools\\Mozilla Firefox\\firefox.exe");
		WebDriver driver = new FirefoxDriver();
		driver.get("https://isisn.nsfc.gov.cn/egrantindex/funcindex/prjsearch-list");
		System.out.println("1 Page title is: " + driver.getTitle());
		WebElement element = driver.findElement(By.id("kw"));
		// 输入关键字
		element.sendKeys("zTree");
		element.submit();
		(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
			public Boolean apply(WebDriver d) {
				return d.getTitle().toLowerCase().endsWith("ztree");
			}
		});
		System.out.println("2 Page title is: " + driver.getTitle());
		// 关闭浏览器
		driver.quit();
	}
}